package co.com.losalpes.marketplace.picontract.entities;

import co.com.losalpes.marketplace.picontract.bo.FabricanteBO;
import co.com.losalpes.marketplace.picontract.bo.OfertaBO;
import co.com.losalpes.marketplace.picontract.bo.SubastaBO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

@Entity
@NamedQueries({@javax.persistence.NamedQuery(name="getAllSubastas", query="select s from Subasta s"), @javax.persistence.NamedQuery(name="getSubastaFromNumSeguimiento", query="select s from Subasta s where s.numSeguimiento = :numSeguimiento"), @javax.persistence.NamedQuery(name="getSubastaFromOrdenCompra", query="select s from Subasta s where s.po.numSeguimiento = :numSeguimientoPO"), @javax.persistence.NamedQuery(name="consultarSubastaPorOrdenCompra", query="select s from Subasta s where s.po.id = :idPO"), @javax.persistence.NamedQuery(name="getSubastasGanadasFabricante", query="select s from Subasta s where s.mejor.fabricante.nit = :nit")})
public class Subasta
  implements Serializable
{

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  protected Long id;

  @Column
  private String numSeguimiento;

  @OneToOne
  protected Oferta mejor;

  @Column
  boolean activa;

  @OneToMany
  protected Collection<Oferta> ofertas;

  @OneToOne
  protected PurchaseOrder po;

  @OneToMany
  private List<Fabricante> fabricantes;

  public Subasta()
  {
    this.ofertas = new ArrayList();
    this.fabricantes = new ArrayList();
  }

  public Subasta(Long id)
  {
    this.id = id;
    this.mejor = new Oferta();
    this.ofertas = new ArrayList();
    this.po = new PurchaseOrder();
    this.fabricantes = new ArrayList();
  }

  public Subasta(Long id, Oferta mejor, Collection<Oferta> aOfertas, PurchaseOrder aPo)
  {
    this.id = id;
    this.mejor = mejor;
    this.ofertas = aOfertas;
    this.po = aPo;
    this.fabricantes = new ArrayList();
  }

  public Subasta(SubastaBO subastaBO)
  {
    setId(subastaBO.getId());
    setMejor(new Oferta(subastaBO.getMejor()));

    Collection ofertasFromBO = new ArrayList();

    for (OfertaBO ofertaBO : subastaBO.getOfertas()) {
      ofertasFromBO.add(new Oferta(ofertaBO));
    }
    setOfertas(ofertasFromBO);
    setPo(new PurchaseOrder(subastaBO.getPo()));
    setNumSeguimiento(subastaBO.getNumSeguimiento());
    List fabs = new ArrayList();
    for (int i = 0; i < subastaBO.getFabricantes().size(); i++) {
      fabs.add(new Fabricante((FabricanteBO)subastaBO.getFabricantes().get(i)));
    }
    setFabricantes(fabs);
  }

  public SubastaBO toBO()
  {
    SubastaBO subastaBO = new SubastaBO();
    subastaBO.setId(this.id);
    subastaBO.setNumSeguimiento(this.numSeguimiento);
    subastaBO.setActiva(this.activa);
    if (this.mejor != null) {
      subastaBO.setMejor(this.mejor.toBO());
    }
    Collection ofertasToBO = new ArrayList();
    for (Oferta element : getOfertas()) {
      ofertasToBO.add(element.toBO());
    }
    subastaBO.setOfertas(ofertasToBO);

    PurchaseOrder aPo = getPo();
    if (aPo != null) {
      subastaBO.setPo(aPo.toBO());
    }

    List fabsBO = new ArrayList();
    for (Fabricante fab : getFabricantes()) {
      fabsBO.add(fab.toBO());
    }
    subastaBO.setFabricantes(fabsBO);

    return subastaBO;
  }

  public Long getId()
  {
    return this.id;
  }

  public void setId(Long aid)
  {
    this.id = aid;
  }

  public Oferta getMejor()
  {
    return this.mejor;
  }

  public void setMejor(Oferta mejor)
  {
    this.mejor = mejor;
  }

  public Collection<Oferta> getOfertas()
  {
    return this.ofertas;
  }

  public void setOfertas(Collection<Oferta> aOfertas)
  {
    this.ofertas = aOfertas;
  }

  public PurchaseOrder getPo()
  {
    return this.po;
  }

  public void setPo(PurchaseOrder aPo)
  {
    this.po = aPo;
  }

  public boolean isActiva() {
    return this.activa;
  }

  public void setActiva(boolean activa) {
    this.activa = activa;
  }

  public String getNumSeguimiento() {
    return this.numSeguimiento;
  }

  public void setNumSeguimiento(String numSeguimiento) {
    this.numSeguimiento = numSeguimiento;
  }

  public List<Fabricante> getFabricantes() {
    return this.fabricantes;
  }

  public void setFabricantes(List<Fabricante> fabricantes) {
    this.fabricantes = fabricantes;
  }
}